
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原型链继承</title>
</head>
<body>
    
    <script>
         /*
            步骤:
            1. 定义父类型构造函数
            2. 给父类型的原型添加方法
            3. 定义子类型的构造函数
            4. 创建父类型的对象赋值给子类型的原型
            5. 将子类型原型的构造属性设置为子类型
            6. 给子类型原型添加方法
            7. 创建子类型的对象: 可以调用父类型的方法
            关键
            1. 子类型的原型为父类型的一个实例对象
            缺点
            1. 无法给父类构造函数传参 
        */


    // 1. 原型链继承 原型链继承的基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。	
	// 缺点：
	// 1:通过原型来实现继承时，原型会变成另一个类型的实例，原先的实例属性变成了现在的原型属性，该原型的引用类型属性会被所有的实例共享。
	// 2:在创建子类型的实例时，没有办法在不影响所有对象实例的情况下给超类型的构造函数中传递参数。(无法给父类构造函数传参)

        // 1. 定义父类型构造函数
        function SuperType() {
            this.name = "yetter"
            this.colors = ['pink', 'blue', 'green']
        }

        // 2. 给父类型的原型添加方法
        SuperType.prototype.getName = function () {
            return this.name
        }
        // 3. 定义子类型的构造函数
        function SubType() {
            this.age = 18
        }
        // 4. 创建父类型的对象赋值给子类型的原型
        SubType.prototype = new SuperType()
        // 5. 将子类型原型的构造属性设置为子类型
        SubType.prototype.constructor = SubType;
        // 6. 给子类型原型添加方法
        SubType.prototype.getAge = function () {
            return this.age
        }
        // 7. 创建子类型的对象: 可以调用父类型的方法
        let ins  = new SubType()
        ins.colors.push("yellow")
        console.log(ins.getName());
        console.log(ins.getAge());
        console.log(ins.colors);


        let ins2  = new SubType()
        console.log(ins2.colors);






    </script>

</body>
</html>